package com.coyote.web.mybatisplus_config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {

    /**
     * mybatis-plus 集成插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // mybatis plus 分页插件
        // interceptor.addInnerInterceptor(paginationInnerInterceptor())
        // 乐观锁插件
        interceptor.addInnerInterceptor(optimisticLockerInterceptor());
        return interceptor;
    }


    /**
     * mybatis-plus 乐观锁插件
     * 自mybatis-plus的3.4.0版本，推荐使用{@link OptimisticLockerInnerInterceptor}
     * 弃用 OptimisticLockerInterceptor
     * </p>
     * 使用方法：
     * 1. 在数据库字段version对应的实体字段上加@Version注解
     * 2. 仅支持 updateById(id) 与 update(entity, wrapper) 方法
     * 3. 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
     * 4. 整数类型下 newVersion = oldVersion + 1，newVersion 会回写到 entity 中
     *
     * @return
     */
    @Bean
    public OptimisticLockerInnerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInnerInterceptor();
    }

//    /**
//     * 逻辑删除组件
//     *
//     * @return
//     */
//    @Bean
//    public ISqlInjector sqlInjector() {
//        return new LogicSqlInjector();
//    }

    /**
     * 一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     * 该配置，可以避免分页后total为0的情况（mybatis-plus-boot-starter version:3.4.0）
     *
     * @return
     */
//    @Bean
//    public ConfigurationCustomizer configurationCustomizer() {
//        return configuration -> configuration.setUseDeprecatedExecutor(false);
//    }


    /**
     * 使用 mybatis-plus 的内置的分页插件
     * //    使用示例：
     * //    @Service
     * //    public class UserServiceImpl implements UserService {
     * //        @Autowired
     * //        private UserMapper userMapper
     * //        @Override
     * //        public IPage<User> getUserList(String name, int pageNum, int pageSize) {
     * //            Page<User> page = new Page<>(pageNum, pageSize)
     * //            return userMapper.selectUserByName(page, name)
     * //        }
     * //    }
     * //
     * //    public interface UserMapper extends BaseMapper<User> {
     * //        // mapper类中，必须这样写，才能达到分页效果
     * //        IPage<User> selectUserByName(Page<User> page, @Param("name") String name)
     * //
     * //    }
     * <p>
     * 如果使用 pageHelper 第三方插件，则不需要配置下面的 PaginationInnerInterceptor 类。
     * 直接开始使用：
     * 如下面的示例：
     * //    PageHelper是一个开源的MyBatis分页插件，可以自动拦截数据库查询请求，并进行分页处理。使用PageHelper，
     * //     我们只需要在查询之前调用PageHelper.startPage方法设置分页参数，然后执行查询语句即可。PageHelper会自动计算分页信息，并将查询结果封装为PageInfo对象。
     * //    以下是一个使用PageHelper进行分页查询的例子：
     * //    @Service
     * //    public class UserServiceImpl implements UserService {
     * //        @Autowired
     * //        private UserMapper userMapper
     * //        @Override
     * //        public PageInfo<User> getUserList(String name, int pageNum, int pageSize) {
     * //            // 在查询之前调用startPage方法设置分页参数
     * //            PageHelper.startPage(pageNum, pageSize)
     * //            List<User> userList = userMapper.selectList(new QueryWrapper<User>().like("name", name))
     * //            // 将查询结果封装为PageInfo对象
     * //            return new PageInfo<>(userList)
     * //        }
     * //    }
     *
     * @return
     */
//    @Bean
//    public PaginationInnerInterceptor paginationInnerInterceptor() {
//        return new PaginationInnerInterceptor(DbType.MYSQL);
//    }

//    @Bean
//    public MetaObjectHandler metaObjectHandler() {
//        return new MyMetaObjectHandler();
//    }
}
